import { JnpfPaperRotation, JnpfPaperSize } from './define';

/**
 * 检查值是否是 null 或 undefined
 * @param value 要检查的值
 * @returns 如果值是 null 或 undefined，返回 true，否则返回 false
 */
export const isNullOrUndefined = (value: any) => {
  return value === null || value === undefined;
};

/**
 * 判断一个值是否为空对象
 * @param obj - 待检查的值
 * @returns 如果是空对象，返回 true；否则返回 false
 */
export const isEmptyObject = (obj: unknown): boolean => {
  return obj !== null && typeof obj === 'object' && !Array.isArray(obj) && Object.keys(obj).length === 0;
};

/**
 * 将指定值从数组中移除并将其添加到数组的末尾。
 * @param array - 要操作的数组。
 * @param  value - 要移动到数组末尾的值。
 * @returns - 操作后的数组（原数组被修改）。
 */
export const moveArrayValueToEnd = (array: any[], value: string | number) => {
  const index = array?.indexOf(value); // 找到目标值的索引

  if (index !== -1) {
    // 如果值存在于数组中
    const [item] = array.splice(index, 1); // 删除目标值
    array.push(item); // 添加到数组末尾
  }

  return array;
};

/**
 * 修正工作表中的单元格数据。
 * 根据传入的单元格数据 (`cellData`) 和指定的行、列数量，判断是否需要修正数据。
 * 如果所有单元格数据异常（如未定义、空字符串、或无效值），则修正为默认配置；
 * 如果存在正常单元格，则返回原始数据。
 *
 */
export const correctSheetCellData = (cellData: any = {}, rowCount: number, columnCount: number) => {
  const correctCellDataConfig = {
    v: ' ',
    t: 1,
  };

  // 如果 cellData 是空对象，直接返回默认初始化的单元格数据
  if (isEmptyObject(cellData)) {
    return {
      0: {
        0: correctCellDataConfig,
      },
    };
  }

  let totalCells = 0;
  let abnormalCells = 0;
  // 统计单元格数据中正常与异常的数量
  for (const rowKey in cellData) {
    const rowValue = cellData[rowKey] ?? {};
    for (const colKey in rowValue) {
      const { v, t } = rowValue[colKey] ?? {};

      // 判断异常单元格条件
      if (v === undefined || (v === '' && t === 1) || (v === 0 && (t === 2 || t === 3))) {
        abnormalCells++;
      }

      totalCells++;
    }
  }
  // 如果存在正常单元格，直接返回原始数据
  if (totalCells > abnormalCells) {
    return cellData;
  }

  // 否则需要修正数据
  for (let i = 0; i < rowCount; i++) {
    for (let j = 0; j < columnCount; j++) {
      const { v, t, custom } = cellData?.[i]?.[j] ?? {};

      // 如果发现第一个需要修正的单元格，修正并结束所有循环
      if (custom === undefined && (v === undefined || (v === '' && t === 1))) {
        if (!cellData[i]) {
          cellData[i] = {};
        }
        cellData[i][j] = correctCellDataConfig;

        return cellData; // 修正完成后直接返回
      }
    }
  }

  // 排查不出来问题，只能返回了
  return cellData;
};

/**
 * 获取打印页面的样式
 * @param paperType - 纸张类型，对应 `JnpfPrintPaperSizeForType` 中的键值
 * @param direction - 打印方向，取值为 `JnpfPrintDirectionEnum.portrait`（纵向）或 `JnpfPrintDirectionEnum.landscape`（横向）
 * @returns 一个包含打印样式的 `<style>` 元素
 */
export function getPrintPageStyle(paperType: string, direction: string) {
  const { w, h } = JnpfPaperSize[paperType as keyof typeof JnpfPaperSize] ?? {};
  const width = direction === JnpfPaperRotation.Portrait ? w : h;
  const height = direction === JnpfPaperRotation.Portrait ? h : w;
  const style = `
@page {
    size: ${width}px ${height}px; 
}
@page {
    margin: 0;
    visibility: hidden;
}
@media print {
    body > * {
        display: none!important;
    }
    #jnpfReportPrint, #jnpfReportPrint * {
        display: block!important;
        height: fit-content;
        overflow: visible;
        top: 0;
        width: fit-content;
    }
    #jnpfReportPrint .printContainer {
        page-break-after: always!important;
        height: ${height}px;
        width: ${width}px;
        position: relative;
    }
}`;
  const $style = document.createElement('style');
  $style.innerHTML = style;
  $style.className = 'jnpfPrintCss';
  return $style;
}
